home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / GNU_Backgammon / gnubg-MAIN-20110822-setup.exe / {app} / batch.py < prev    next >
Text File  |  2007-07-02  |  7KB  |  213 lines

  1. #
  2. # batch.py -- batch import and analysis of multiple files using gnubg
  3. #
  4. # by Jon Kinsey <Jon_Kinsey@hotmail.com>, 2004
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of version 3 or later of the GNU General Public License as
  8. # published by the Free Software Foundation.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18. #
  19. # $Id: batch.py,v 1.4 2007/07/02 12:50:12 ace Exp $
  20.  
  21. """
  22.  batch.py -- batch import and analysis of multiple files using gnubg
  23.  
  24.  by Jon Kinsey <Jon_Kinsey@hotmail.com>, 2004
  25. \n"""
  26.  
  27. # Achim Mueller <ace@gnubg.org>
  28. #
  29. # Usage: start gnubg -t
  30. # (no game) load python batch.py
  31. # Answer questions regarding source and destination directory
  32. # Enjoy the analysis
  33.  
  34. import os
  35.  
  36. # file extensions, names and gnubg import commands
  37. extensions = ['mat', 'pos', 'sgg', 'tmg', 'txt']
  38. extTypes = ['.mat', '.pos', 'Games grid', 'True money game', 'Snowie text']
  39. extCmds = ['mat', 'pos', 'sgg', 'tmg', 'snowietxt']
  40.  
  41. LAST_VALUES = "batch.dirs"
  42.  
  43. def CheckFiles(files, dir, destDir):
  44.     "Check files aren't already analyzed"
  45.     fileList = [[], [], [], [], []]
  46.     foundFile = False
  47.  
  48.     for eType in extTypes:
  49.         numType = extTypes.index(eType)
  50.         for file in files[numType]:
  51.             # Check that file hasn't already been analyzed
  52.             dot = file.rfind('.')
  53.             existingOutputFile = destDir + file[ : dot] + '.sgf'
  54.             if (os.access(existingOutputFile, os.F_OK)):
  55.                 # See if newer
  56.                 if os.stat(existingOutputFile).st_mtime > os.stat(dir + file).st_mtime:
  57.                     continue    # Skip as already processed
  58.             foundFile = True
  59.             fileList[numType].append(file)
  60.  
  61.     if foundFile:
  62.         return fileList
  63.     else:
  64.         print "  ** All files in directory already processed **"
  65.  
  66. def GetFiles(dir):
  67.     "Look for gnubg import files in dir"
  68.     try:
  69.         files = os.listdir(dir)
  70.     except:
  71.         print "  ** Directory not found **"
  72.         return 0
  73.  
  74.     fileList = [[], [], [], [], []]
  75.     foundAnyFile = False
  76.     foundBGFile = False
  77.     # Check each file in dir
  78.     for file in files:
  79.         # Check it's a file (not a directory)
  80.         if os.path.isfile(dir + file):
  81.             foundAnyFile = True
  82.             # Check has supported extension
  83.             dot = file.rfind('.')
  84.             if dot != -1:
  85.                 ext = file[dot + 1 : ].lower()
  86.                 if ext in extensions:
  87.                     foundBGFile = True
  88.                     ftype = extensions.index(ext)                    
  89.                     fileList[ftype].append(file)
  90.  
  91.     if foundBGFile:
  92.         return fileList
  93.     else:
  94.         if not foundAnyFile:
  95.             print "  ** No files in directory **"
  96.         else:
  97.             print "  ** No valid files found in directory **"
  98.         return 0
  99.  
  100. def AnalyzeFile(prompt, file, dir, destDir, type):
  101.     "Run commands to analyze file in gnubg"
  102.     gnubg.command('import ' + extCmds[type] + ' "' + dir + file + '"')
  103.     print prompt + " Analysing " + file
  104.     gnubg.command('analyze match')
  105.     file = file[:-len(extensions[type])] + "sgf"
  106.     gnubg.command('save match "' + destDir + file + '"')
  107.  
  108. def GetYN(prompt):
  109.     confirm = '';
  110.     while len(confirm) == 0 or (confirm[0] != 'y' and confirm[0] != 'n'):
  111.         confirm = raw_input(prompt + " (y/n): ").lower()
  112.     return confirm
  113.  
  114. def GetDir(prompt):
  115.     dir = raw_input(prompt)
  116.     if dir:
  117.         # Make sure dir ends in a slash
  118.         if (dir[-1] != '\\' and dir[-1] != '/'):
  119.             dir = dir + '/'
  120.     return dir
  121.  
  122. def BatchImport():
  123.     "Import and analyse all files in a directory"
  124.     dirs = [0, 0]
  125.     # See if last dirs saved
  126.     if (os.access(LAST_VALUES, os.F_OK)):
  127.         file = open(LAST_VALUES, "r")
  128.         dirs = file.readlines()
  129.         file.close()
  130.         # Remove new lines
  131.         dirs[0] = dirs[0][:-1]
  132.         dirs[1] = dirs[1][:-1]
  133.         if os.path.isdir(dirs[0]) and os.path.isdir(dirs[1]):
  134.             print "Last used dirs:\n from:", dirs[0][:-1], "\n   to:", dirs[1][:-1]
  135.             if GetYN("Reuse") == 'n':
  136.                 dirs = [0, 0]
  137.         else:
  138.             dirs = [0, 0]
  139.  
  140.     while True:
  141.         # Get directory with original files in
  142.         if (dirs[0] == 0):
  143.             dirs[0] = GetDir("Directory containing files to import (enter-exit): ")
  144.             if not dirs[0]:
  145.                 return
  146.  
  147.         # Look for some files
  148.         inFiles = GetFiles(dirs[0])
  149.         if not inFiles:
  150.             dirs = [0, 0]
  151.             continue
  152.  
  153.         if (dirs[1] == 0):
  154.             # Get directory to put analyzed files in
  155.             while True:
  156.                 dirs[1] = GetDir("Directory to put analyzed files in (enter-same dir): ")
  157.                 if not dirs[1]:
  158.                     dirs[1] = dirs[0]
  159.  
  160.                 if os.path.isdir(dirs[1]):
  161.                     break;
  162.                 print "  ** Directory not found **"
  163.  
  164.         # Make sure files are new
  165.         files = CheckFiles(inFiles, dirs[0], dirs[1])
  166.         if files:
  167.             break
  168.         dirs = [0, 0]
  169.  
  170.     # Display files that will be analyzed
  171.     numFound = 0
  172.     for eType in extTypes:
  173.         numType = extTypes.index(eType)
  174.         if len(files[numType]):
  175.             print "\n" + eType + " files:"
  176.             for file in files[numType]:
  177.                 print "    " + file
  178.                 numFound = numFound + 1
  179.  
  180.     if (numFound > 1):
  181.         print "\n", numFound, "files found\n"
  182.  
  183.     # Check user wants to continue
  184.     if GetYN("Continue") == 'n':
  185.         return
  186.  
  187.     # Save dirs for next time
  188.     file = open(LAST_VALUES, "w")
  189.     file.write(dirs[0] + "\n")
  190.     file.write(dirs[1] + "\n")
  191.     file.close()
  192.     
  193.     # Analyze each file
  194.     num = 0
  195.     for eType in extTypes:
  196.         if len(files[extTypes.index(eType)]):
  197.             print "\n" + eType + " files:"
  198.             numType = extTypes.index(eType)
  199.             for file in files[numType]:
  200.                 num = num + 1
  201.                 prompt = "\n(%d/%d)" % (num, numFound)
  202.                 AnalyzeFile(prompt, file, dirs[0], dirs[1], numType)
  203.  
  204.     print "\n** Finished **"
  205.     return
  206.  
  207. # Run batchimport on load
  208. try:
  209.     print __doc__
  210.     BatchImport()
  211. except Exception, (e):
  212.     print "Error:", e
  213.